# 模块
# import 模块名
# form 模块名 import 工具名

# 导入模块
# 方式1：
# import random
# 使用工具：方式1
# print(random.randint(1, 3))
# 方式2：
# from random import randint
# 使用工具：方式2
# print(randint(1, 3))

# 包
# 方式1:导入包中模块
# from 包名 import 模块名

# 方式2:导入包对于模块中的工具
# from 包名.模块名 import 工具名

 # 直接从包导入工具
# from hm_message import send_message
# 使用工具：模块名.工具名
# send_message.send()
# 从包对应的模块中导入工具
# from hm_message.receive_message import receive
# 使用工具：工具名
# receive()

# 案例演示
# 定义变量：不可变数据类型
# num = 100
# print(id(num))
# num = 200
# print(id(num))
# 结论:给变量赋值本质修改的是数据的引用
# 即:重新赋值后内存地址是不一样的
# 定义变量：可变类型
# list1 = [1,2,3]
# print(id(list1))
# 查看数据/变量的引用
# list1.append(4)
# print(id(list1))

# 局部变量
# 需求:
# 1. 定义函数 login_front 实现前台系统登录
# 2. 定义函数 login_back 实现后台登录
# 3. 要求使用同样的变量名, 分别记录前后台登录信息中的账号和密码
# def login_front():
# 定义局部变量
#     username = "13800000001"
#     password = "123456"
# 打印登录成功
#     print(f"登录成功，账号：{username},密码：{password}")
# def login_back():
# 定义局部变量
#     username = "admin"
#     password = "123456"
# 打印登录成功
#     print(f"登录成功，账号：{username},密码：{password}")
# 调用函数
# login_front()
# login_back()

# 全局变量
# 需求:
# 1. 定义函数 login_front 实现前台系统登录
# 2. 定义函数 login_back 实现后台登录
# 3. 要求密码使用同样的全局变量名, 分别记录前后台登录信息中的账号和密码
# def login_front():
# 定义局部变量
#     username = "13800000001"
# password = "123456"
# 打印登录成功
#     print(f"登录成功，账号：{username},密码：{password}")
# def login_back():
# 定义局部变量
# 全局和局部变量案例
#     username = "admin"
#     password = "6666"
# 打印登录成功
#     print(f"登录成功，账号：{username},密码：{password}")
# 调用函数
# password = "123456" # 定义全局变量
# login_front()
# login_back()
#
# def add_test(num1, num2):
# # 局部变量
#     num1 = 100
#     print(num1 + num2)
# def sub_test(num1, num2):
#     print(num1 - num2)
# add_test(10,200)
# sub_test(10,200)

# 全局变量修改
# 案例
# 需求：需要使用全局变量，但是又不想用它自己提供的值，请问如何处理？
# 全局变量
# num = 10
# def demo1():
#     num = 100
#     print(num)
# def demo2():
#     global num
#     num = 200
#     print(num)
# def demo3():
#     print(num)
# 调用函数
# demo1() # 100
# demo2() # 200
# demo3() # 200

# 缺省参数
# 定义函数
def stu_info(name, age, gender="男"):
# 打印学生基本信息
    print(f"{name}的年龄是：{age}，性别是：{gender}")

# 定义多值参数的函数
def func(*args):
    print(args)

# 元组拆包--案例演示
# 需求:
# 1. 定义一个函数 sum_numbers，可以接收的 任意多个整数
# 2. 功能要求：将传递的 所有数字累加 并且返回累加结果
# 分析：
# 1.定义函数（有参数，并且个数不确定）
def sum_numbers(*args):
    result = 0
    for i in args:
        result += i
    # 返回结果
    return f"累加的结果是：{result}"
# 2.调用函数
aa = sum_numbers(1,2,3,4,5,6)
print(aa)

# 调用函数
def sum_numbers(*args):
    """
    累计求和返回结果
    :param args: 多个参数
    :return: 返回计算结果
    """
    result = 0
    for i in args:
        result += i
    return result
num = (1, 2, 3, 4, 5) # 定义一个元组
print(sum_numbers(*num))

# 匿名函数--案例一
# 定义函数
def demo(a, b):
    result = a + b
    # 返回结果
    return result
    # 调用函数
    print(demo(10, 20))
# 2.匿名函数实现两个数字求和
result = lambda a, b: a + b
# 使用匿名函数
print(result(10, 20))

# 案例演示2
# 1. 已知用户信息数据如下:
user_list = [
    {'name': '张三', 'age': 22, 'title': '测试工程师'},
    {'name': '李四', 'age': 24, 'title': '开发工程师'},
    {'name': '王五', 'age': 21, 'title': '测试工程师'}
    ]
keys = lambda x:x.get("age") # 这个x就是列表的每个元素
# 1.直接进行排序：升序
user_list.sort(key=keys)
# 打印原始列表
print(user_list)
# 2.降序
user_list.sort(key=keys,reverse=True)
# 打印原始列表
print(user_list)

# 异常
# 输入一个数字，处理8除以该数字的计算
# 要求:当除数为0时捕获 ZeroDivisionError 的异常,并输出:除数不能为0
try: # 尝试执行的代码
    num = int(input("请输入一个整数："))
    result = 8 / num
    print(result)
except ZeroDivisionError: # 捕获特定异常后执行的代码
    print("除数不能为0")

# 捕获未知异常
try: # 尝试执行的代码
    num = int(input("请输入一个整数："))
    result = 8 / num
    print(result)
except Exception as e: # 捕获所有异常后执行的代码
    print(f"捕获的异常类型有：{e}")


try:
# 尝试执行的代码
    pass
except 错误类型1:
# 针对错误类型1， 对应的代码处理
    pass
except 错误类型2:
    # 针对错误类型2， 对应的代码处理
    pass
except Exception as e:
    # 打印错误信息
    print(e)
else:
    # 没有异常才会执行的代码
    pass
finally:
    # 无论是否有异常， 都会执行的代码
    pass

# 案例演示
# 需求：
# 1. 提示用户输入一个整数
# 2. 使用 8 除以用户输入的整数并且输出
# 3. 如果不是整数, 提示：输入错误,请输入数字
# 4. 如果是整数，但是除数为0，提示：不能被0整除
# 5. 如果是满足条件的整数, 则进一步判断是奇数还是偶数
# 6. 最终提示: 程序运行结束

try:
    num = int(input("请输入数字："))
except ValueError:
    print("输入的是非数字")
except Exception as e:
    print(f"其他类型错误：{e}")
else:
    if num % 2 == 0:
        print("偶数")
    else:
        print("奇数")
finally:
    print("程序运行结束")

# 主动抛出异常
# 需求：
# 1. 定义 input_password 函数， 提示用户输入密码
# 2. 如果用户输入长度 < 8， 抛出异常
# 3. 如果用户输入长度 >=8， 返回输入的密码

def input_password():
    """输入函数"""
    pwd = input("请输入密码：")
    if len(pwd) < 8:
        ex = Exception("输入密码长度不足8位")
        raise ex
    else:
        return pwd
    if __name__ == '__main__':
    # 捕获异常
        try:
            print(input_password())
        except Exception as e:
            print(e)

